import { eq, and } from "drizzle-orm";
import { db } from "../db";
import comments from "../db/schema/comments";

/**
 * 获取评论列表（支持多种查询条件）
 * @param params 可选的查询参数
 * @param params.id 评论ID
 * @param params.postId 文章ID
 * @param params.ownerId 用户ID
 * @returns 符合条件的评论列表
 * @example
 * // 获取所有评论
 * getComments()
 * // 获取指定ID的评论
 * getComments({ id: 1 })
 * // 获取指定文章的所有评论
 * getComments({ postId: 1 })
 * // 获取指定用户的所有评论
 * getComments({ ownerId: 1 })
 * // 组合查询：获取指定用户在指定文章下的评论
 * getComments({ postId: 1, ownerId: 1 })
 */
export const getComments = async (params?: {
  id?: number;
  postId?: number;
  ownerId?: number
}) => {
  // 如果没有传入任何参数，返回所有评论
  if (!params || Object.keys(params).length === 0) {
    return await db.select().from(comments);
  }

  // 构建查询条件数组
  const conditions = [];

  if (params.id !== undefined) {
    conditions.push(eq(comments.id, params.id));
  }

  if (params.postId !== undefined) {
    conditions.push(eq(comments.postId, params.postId));
  }

  if (params.ownerId !== undefined) {
    conditions.push(eq(comments.ownerId, params.ownerId));
  }

  // 如果只有一个条件，直接使用
  if (conditions.length === 1) {
    return await db.select().from(comments).where(conditions[0]);
  }

  // 如果有多个条件，使用 and 组合
  return await db.select().from(comments).where(and(...conditions));
};

/**
 * 创建评论
 * @param params comment text, post id and owner id
 * @returns created comment
 */
export const createComment = async (params: { text: string; postId: number; ownerId: number }) => {
  return await db.insert(comments).values(params);
};

/**
 * 更新评论
 * @param params comment id and text
 * @returns updated comment
 */
export const editComment = async (params: { id: number; text: string }) => {
  return await db.update(comments).set({ text: params.text }).where(eq(comments.id, params.id));
};

/**
 * 删除评论
 * @param params comment id
 * @returns deleted comment
 */
export const deleteComment = async (params: { id: number }) => {
  return await db.delete(comments).where(eq(comments.id, params.id));
};

/**
 * 添加评论
 * @param params comment text, post id and owner id
 * @returns created comment
 */
export const addComment = async (params: { text: string; postId: number; ownerId: number }) => {
  return await db.insert(comments).values(params);
};
